package wang.wangby.lazydoc.common;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.springframework.core.annotation.AnnotationUtils;

import wang.wangby.annotation.Property;
import wang.wangby.annotation.Remark;
import wang.wangby.utils.StringUtil;

/** 文档的生成规则 */
public class DocRules {

	/**
	 * 当参数是类的是,它的某个字段是否可以当做参数 当前规则,配置了Remark属性,或者包含了get和set方法的都可以当做参数
	 * 
	 * @param field 字段
	 * @param clazz 所属类
	 **/
	public boolean isParameter(Field field, Class clazz) {
		Remark rk = field.getAnnotation(Remark.class);
		if (rk != null) {
			return true;
		}
		boolean get = false;
		boolean set = false;
		String name = StringUtil.firstUp(field.getName());
		for (Method m : field.getDeclaringClass().getMethods()) {
			if (m.getName().equals("get" + name)) {
				get = true;
			}
			if (m.getName().equals("set" + name)) {
				set = true;
			}
		}
		if (get == true && set == true) {
			return true;
		}
		return false;
	}

	
	//获得某个类可以作为参数的字段
	public List<Field> getParamField(Class clazz) {
		if(!hashChildren(clazz)) {
			return new ArrayList();
		}
		List list = new ArrayList();
		for (Field f : clazz.getDeclaredFields()) {
			if (isParameter(f, clazz)) {
				list.add(f);
			}
		}
		return list;
	}

	// 获得某个类所有可作为参数的字段,java类和原生类直接返回false,如果类名没有.就认为是原生类
	public boolean hashChildren(Class clazz) {
		String name = clazz.getName();
		if (name.startsWith("java.")) {
			return false;
		}
		if (name.indexOf(".") == -1) {
			return false;
		}
		return true;
	}
	
	
	
	// 获得字段的描述
	public String getFieldDesc(Field field) {
		Remark rmk = AnnotationUtils.findAnnotation(field, Remark.class);
		String desc = "";
		if (rmk != null) {
			desc = rmk.value();
		}
		if (!StringUtil.isEmpty(desc)) {
			return desc;
		}
		Property pp = AnnotationUtils.findAnnotation(field, Property.class);
		if (pp != null) {
			desc = pp.value();
		}
		if (!StringUtil.isEmpty(desc)) {
			return desc;
		}
		return field.getName();
	}
}
